#ifndef _VECTOR2_H_
#define _VECTOR2_H_

#include <cmath>

// 用于处理位置、速度等2D中的几何量
class Vector2
{
public:
    float x = 0;
    float y = 0;

public:
    Vector2() = default;
    ~Vector2() = default;

    Vector2(float x, float y)
        : x(x), y(y) {
    }

    Vector2 operator+(const Vector2& vec) const
    {
        return Vector2(x + vec.x, y + vec.y);
    }

    void operator+=(const Vector2& vec)
    {
        x += vec.x, y += vec.y;
    }

    void operator-=(const Vector2& vec)
    {
        x -= vec.x, y -= vec.y;
    }

    Vector2 operator-(const Vector2& vec) const
    {
        return Vector2(x - vec.x, y - vec.y);
    }

    float operator*(const Vector2& vec) const
    {
        return x * vec.x + y * vec.y;
    }

    Vector2 operator*(float val) const
    {
        return Vector2(x * val, y * val);
    }

    void operator*=(float val)
    {
        x *= val, y *= val;
    }

    bool operator==(const Vector2& vec) const
    {
        return x == vec.x && y == vec.y;
    }

    bool operator!=(const Vector2& vec) const
    {
        return x != vec.x || y != vec.y;
    }

    float magnitude() const 
    {
        return sqrt(x * x + y * y);
    }

    Vector2 normalize() const
    {
        float mag = magnitude();
        if (mag == 0) return Vector2(0, 0);
        return Vector2(x / mag, y / mag);
    }

    void normalize_self()
    {
        float mag = magnitude();
        if (mag != 0) {
            x /= mag;
            y /= mag;
        }
    }
};

#endif // !_VECTOR2_H_
